import { inject, reactive } from 'vue';

export function createPinia() {
  return {
    install(app) {
      //创建一个响应式的store对象
      const store = reactive({});

      //将setSubStore向外提供
      app.provide('setSubStore', (storeName, subStore) => {
        //给store对象新增属性
        store[storeName] = subStore;

        //定义$patch方法
        const $patch = (options) => {
          //可以有多个$patch方法
          for (let key in options) {
            store[storeName][key] = options[key];
          }
        };

        //store对象里定义的属性新增$patch方法
        store[storeName].$patch = $patch;
      });

      //将piniaStore向外提供
      app.provide('piniaStore', store);
    }
  };
}

export function defineStore(storeName, options) {
  //创建一个响应式的store对象
  const store = reactive({});

  //获取用户定义的state函数执行后的结果是state数据
  const state = options.state();

  //获取用户定义的actions对象，对象里保存修改state数据的异步方法
  const actions = options.actions;

  //遍历state数据对象里的所有属性
  for (let key in state) {
    //复制state对象里所有数据到store里
    store[key] = state[key];
  }

  //遍历actions里所有的方法并复制到store对象里
  for (let method in actions) {
    store[method] = actions[method];
  }

  // console.log(store);
  //Proxy {count: 0, plusAsync: ƒ, $patch : ƒ}

  //defineStore(name, options)返回一个函数
  return function () {
    //返回一个对象里保存$patch方法和actions里定义的方法
    const piniaStore = inject('piniaStore');

    if (!piniaStore[storeName]) {
      const setSubStore = inject('setSubStore');
      setSubStore(storeName, store);
    }

    /**
     console.log(piniaStore);
     * Proxy {
     *   counter: {
     *     count: NaN,
     *     {count: 0, plusAsync: ƒ, $patch: ƒ}
     *   }
     * }
     */

    return piniaStore[storeName];
  };
}
